﻿import JSZip from 'jszip'
import { kmlToGeoJSON } from './conver/kmlToGeoJSON'

let getDom = (xml) => new DOMParser().parseFromString(xml, 'text/xml')
let getExtension = (fileName) => fileName.split('.').pop()

let getKmlDom = (kmzFile) => {
    var zip = new JSZip()
    return zip.loadAsync(kmzFile).then((zip) => {
        let kmlDom = null
        zip.forEach((relPath, file) => {
            if (getExtension(relPath) === 'kml' && kmlDom === null) {
                kmlDom = file.async('string').then(getDom)
            }
        })
        return kmlDom || Promise.reject('No kml file found')
    })
}
let getWpmlDom = (kmzFile) => {
    var zip = new JSZip()
    return zip.loadAsync(kmzFile).then((zip) => {
        let kmlDom = null
        zip.forEach((relPath, file) => {
            if (getExtension(relPath) === 'wpml' && kmlDom === null) {
                kmlDom = file.async('string').then(getDom)
            }
        })
        return kmlDom || Promise.reject('No kml file found')
    })
};
let fromKml = {
    author: '', // 文件创建作
    createTime: '', // 文件创建时间
    updateTime: '', // 文件更新时间
    // 任务信息 ---------------------------------------------->
    flyToWaylineMode: '', // 飞向首航点模式 *
    finishAction: '', // 飞向首航点模式 *
    exitOnRCLost: '', // 失控是否继续执行航线 *
    executeRCLostAction: '', // 失控动作类型 *
    takeOffSecurityHeight: '', // 安全起飞高度 *
    globalTransitionalSpeed: '', // 全局航线过渡速度 *
    globalRTHHeight: '100', // *
    takeOffRefPoint: '', // 参考起飞点
    takeOffRefPointAGLHeight: '', // 参考起飞点海拔高度
    droneInfo: { // 飞行器机型信息
        droneEnumValue: '', // 飞行器机型主类型 *
        droneSubEnumValue: '' // 飞行器机型子类型 *
    },
    payloadInfo: { // 负载机型信息
        payloadEnumValue: '', // 负载机型主类型 *
        payloadSubEnumValue: '', // 负载机型子类型 *
        payloadPositionIndex: '' // 负载挂载位置 *
    },
    // 模板共用的元素 ---------------------------------------------->
    templateType: '', // 预定义模板类型 *
    templateId: '', // 模板ID *
    autoFlightSpeed: '', // 全局航线飞行速度 *
    waylineCoordinateSysParam: { // 坐标系参数
        coordinateMode: '', // 经纬度坐标系 *
        heightMode: '', // 航点高程参考平面 *
        globalShootHeight: '', // 飞行器离被摄面高度 *
        positioningType: '', //经纬度与高度数据源
        surfaceFollowModeEnable: '', // 是否开启仿地飞行 *
        surfaceRelativeHeight: '', // 仿地飞行离地高度（相对地面高）*
    },
    payloadParam: { // 负载设置
        payloadPositionIndex: '', // 负载挂载位置 *
        focusMode: '', // 负载对焦模式  P1*
        meteringMode: '', // 负载测光模式 P1*
        dewarpingEnable: '', // 是否开启畸变矫正 P1*
        returnMode: '', // 激光雷达回波模式 L1*
        samplingRate: '', // 负载采样率 L1*
        scanningMode: '', // 负载扫描模式 L1*
        modelColoringEnable: '', // 真彩上色 L1*
        imageFormat: '', // 图片格式列表 *
    },
    // 航点飞行模板元素 ---------------------------------------------->
    globalWaypointTurnMode: '', // 全局航点类型（全局航点转弯模式） *
    globalUseStraightLine: '', // 全局航段轨迹是否尽量贴合直线 *
    gimbalPitchMode: '', // 云台俯仰角控制模式 *
    globalHeight: '', // 全局航线高度（相对起飞点高度） *
    globalWaypointHeadingParam: { // 全局偏航角模式参数
        waypointHeadingMode: '', // 飞行器偏航角模式 *
        waypointHeadingAngle: '', // 飞行器偏航角度 *
        waypointHeadingPathMode: '', // 飞行器偏航角转动方向 *
        waypointPoiPoint: '', //
        waypointHeadingPoiIndex: '', //
    },
    caliFlightEnable: '', // 是否开启标定飞行
    Placemark: [],
    positionsArr: [],
}

let fromWpml = {
    waylineId: '', // 航线ID *
    executeHeightMode: '', // 执行高度模式 *
    startActionGroup: { // 航线初始动作

    },
    distance: '', // 距离 *
    duration: '', //  *
}

//kml转geojson
export function toGeoJSON(doc) {
    if (!doc) return Promise.reject('参数不能为空')

    if (isString(doc)) {
        return fetch(doc).then(res => res.blob())
            .then(function(xml) {
                return getKmlDom(xml)
            })
            .then(function(kmlDom) {
                fromKml.Placemark = []
                fromKml.positionsArr = []
                fromKml = kmlToGeoJSON(kmlDom, fromKml)
                return fetch(doc).then(res => res.blob())
                    .then(function(xml) {
                        return getWpmlDom(xml)
                    })
                    .then(function(wpmlDom) {
                        fromWpml = kmlToGeoJSON(wpmlDom, fromWpml)
                        console.log(fromWpml);
                        return Object.assign(fromKml, fromWpml)
                    })
            })
    } else if (doc.getRootNode) {
        //直接传docmect文档
        let geojson = kmlToGeoJSON(doc)
        return Promise.resolve(geojson)
    } else {
        // 直接传入 Blob（KMZ 文件）
        return getKmlDom(doc)
            .then(function(kmlDom) {
                fromKml.Placemark = []
                fromKml.positionsArr = []
                fromKml = kmlToGeoJSON(kmlDom, fromKml)
                return getWpmlDom(doc)
                    .then(function(wpmlDom) {
                        fromWpml = kmlToGeoJSON(wpmlDom, fromWpml)
                        return Object.assign(fromKml, fromWpml)
                    })
                    .catch(function() {
                        // 没有 wpml 时只返回 KML 解析结果
                        return fromKml
                    })
            })
    }
}

function isString(str) {
    return typeof str == 'string' && str.constructor == String
}